#include<iostream>
#include<pthread.h>
#include<string>
#include<vector>
#include<unistd.h>
using namespace std;
int NUM=5;
int ticket=100;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//锁//全局变量的创建方法

// class threadData{
// public:
//     threadData(int number,pthread_mutex_t*mutex){
//         threadname="thread"+to_string(number);
//         lock=mutex;
//     }
// //private:
//     pthread_mutex_t *lock;
//     string threadname;
// };
// void *getTickets(void *arg){//在抢票系统中发现负的的数字还在抢，这说明发生了，重入函数的错误
//     threadData*td=static_cast<threadData*>(arg);
//     while(true){
//         pthread_mutex_lock(td->lock);
//         if(ticket>0){
//             ticket--;
//             cout<<td->threadname<<", get a ticket:"<<ticket<<endl;
//             pthread_mutex_unlock(td->lock);
//             usleep(100);//放在这里让用完锁的“人”，离锁远一点，让其他的"人"也可以用到锁
//         }
//         else{
//             pthread_mutex_unlock(td->lock);//如果是只在上面锁会有一个问题，走到else直接跳出循环，会导致没人解开锁
//             break;
//         }
//     }
//     printf("%s ... quit\n",td->threadname.c_str());
//     return nullptr;
// }
// int main()
// {
//     pthread_mutex_t mutex;
//     pthread_mutex_init(&mutex,NULL);//局部变量的初始化
//     //多进程
//     vector<pthread_t> tids;//保存多进程的tid
//     vector<threadData *>thread_datas;//保存多进程的每个threaddata
//     for(int i=1;i<=NUM;i++){
//         pthread_t tid;
//         threadData*td=new threadData(i,&mutex);
//         thread_datas.push_back(td);
//         pthread_create(&tid,nullptr,getTickets,thread_datas[i-1]);
//         tids.push_back(tid);
//     }
//     for(auto thread:tids)
//     {
//         pthread_join(thread,nullptr);
//     }
//     for(auto thread_data:thread_datas)
//     {
//         delete thread_data;
//     }
//     pthread_mutex_destroy(&mutex);//清除变量
//     return 0;
// }
// int main()
// {
//     //死锁问题
//     pthread_mutex_lock(&mutex);
//     pthread_mutex_lock(&mutex);
//     cout<<"你好"<<endl;//这个时候自己锁住了自己，下面的程序不执行
//     return 0;
// }